![Amazon RDS for MariaDBで実行中のクエリをkillする](https://devio2023-media.developers.io/wp-content/uploads/2014/05/Amazon_RDS.png)
Amazon RDS for MariaDBで実行中のクエリをkillする
はじめに
MariaDBはMySQLの派生なので共通的に使える機能は多々ありますが、一部に相違があります。RDS for MariaDBもRDS for MySQLと同じように使えるところと違うところがあります。その一つがシステムストアドプロシージャです。RDS for MySQLで用意されているシステムストアドプロシージャは全てRDS for MariaDBで使うことができますが、さらに追加で以下2つのシステムストアドプロシージャが用意されています。
mysql.rds_set_external_master_gtidについてはRDS for MariaDBへのレプリケーション #reinventをご覧下さい。
今回はmysql.rds_kill_query_idを使って、Amazon RDS for MariaDBで実行中のクエリをkillしてみました!
やってみた
RDS for MariaDBで以下のストアドプロシージャを作成します。延々とループでスリープし続けるだけのものです。
mysql> delimiter $$ mysql> create procedure test_sleep(in x int) -> begin -> loop -> set x = 1; -> select sleep(360); -> end loop; -> end -> $$ Query OK, 0 rows affected (0.01 sec) mysql> delimiter ;
このストアドプロシージャを実行します。
mysql> call test_sleep(1);
別のセッションでRDS for MariaDBに接続します。INFORMATION_SCHEMA.PROCESSLISTからQueryIDを確認します。
mysql> SELECT USER, HOST, COMMAND, TIME, STATE, INFO, QUERY_ID FROM INFORMATION_SCHEMA.PROCESSLIST ; +----------+---------------------+---------+------+----------------------+---------------------------------------------------------------------------------------------+-----------+ | USER | HOST | COMMAND | TIME | STATE | INFO | QUERY_ID | +----------+---------------------+---------+------+----------------------+---------------------------------------------------------------------------------------------+-----------+ | dbadmin | 172.31.14.208:43392 | Query | 2 | User sleep | select sleep(360) | 202624612 | | dbadmin | 172.31.14.208:43360 | Query | 0 | Filling schema table | SELECT USER, HOST, COMMAND, TIME, STATE, INFO, QUERY_ID FROM INFORMATION_SCHEMA.PROCESSLIST | 202624613 | | rdsadmin | localhost:14846 | Sleep | 4 | | NULL | 202624605 | +----------+---------------------+---------+------+----------------------+---------------------------------------------------------------------------------------------+-----------+ 3 rows in set (0.00 sec)
今sleepしているQueryIDが202624612だということがわかりました。 RDS for MySQLではmysql.rds_kill_queryを使ってスレッドをkillする仕組みだったのですが、RDS for MariaDBではmysql.rds_kill_query_idを使ってクエリをkillします。
mysql> CALL mysql.rds_kill_query_id(202624612); Query OK, 0 rows affected (0.01 sec)
確認、sleepしているQueryIDが202624612から202624623に変わってます。クエリがKillされた為に、次のループが実行されたからです。
mysql> SELECT USER, HOST, COMMAND, TIME, STATE, INFO, QUERY_ID FROM INFORMATION_SCHEMA.PROCESSLIST ; +----------+---------------------+---------+------+----------------------+---------------------------------------------------------------------------------------------+-----------+ | USER | HOST | COMMAND | TIME | STATE | INFO | QUERY_ID | +----------+---------------------+---------+------+----------------------+---------------------------------------------------------------------------------------------+-----------+ | dbadmin | 172.31.14.208:43392 | Query | 1 | User sleep | select sleep(360) | 202624623 | | dbadmin | 172.31.14.208:43360 | Query | 0 | Filling schema table | SELECT USER, HOST, COMMAND, TIME, STATE, INFO, QUERY_ID FROM INFORMATION_SCHEMA.PROCESSLIST | 202624624 | | rdsadmin | localhost:14846 | Sleep | 13 | | NULL | 202624605 | +----------+---------------------+---------+------+----------------------+---------------------------------------------------------------------------------------------+-----------+ 3 rows in set (0.00 sec)
ちなみに、INFORMATION_SCHEMA.PROCESSLISTテーブルの構造もMySQLとMariaDBで大きく違います。
- MySQL :: MySQL 5.7 Reference Manual :: 20.16 The INFORMATION_SCHEMA PROCESSLIST Table
- Information Schema PROCESSLIST Table - MariaDB Knowledge Base
さいごに
プロセスのKillはMySQL、MariaDB共にmysql.rds_killで実行可能ですが、プロセスではなくクエリ(スレッド)単位でkillする場合には別のシステムストアドプロシージャを使わなくてはならないことに注意してください。